# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：6.15 特殊方法__method__.py
# 开发时间：2021/3/27 14:38

# 特殊方法
# 以__开头结尾的方法__method__
# 特殊方法一般不需要手动调用，需要在特殊阶段自动调用
# Python使用手册中，The Python Language Reference,3.Data Module，3.3.1special method names里面有详细记载
# __new__(cls), __init__(self), __del__(self)等等
# __repr__(self), __str__(self), __byte__(self), __format__(self, format_spec)等等
class Person(object):
    """docstring for person"""

    # 创建对象时，自动调用
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 将对象p1转换为字符串str时调用，用来指定【对象转换字符串】的结果
    def __str__(self):
        return "Person [name = %s, age = %d]" % (self.name, self.age)

    # 会在对当前对象使用repr()函数时，调用；指定对象在交互模式中，直接输出结果
    def __repr__(self):
        return 'Hello Maverick'

p1 = Person('Ming', 23)
p2 = Person('MoMo', 22)

# 未重写__str__,打印p1
# print(p1)
# 结果：<__main__.Person object at 0x000002E6F9D850C8>
# 解析：打印对象，其实是打印__str__()的返回值
# 重写__str__,打印p1
# print(p1) # == print(str(p1))
# 结果：Person [name = Ming, age = 23]

# 会在对当前对象使用repr()函数时
# print(repr(p1))
# 结果：Hello Maverick

# self是当前对象，other是与当前对象比较的其他对象
# object.__lt__(self, other) <
# object.__le__(self, other) <=
# object.__eq__(self, other) =
# object.__ne__(self, other) !=
# object.__gt__(self, other) >
# object.__ge__(self, other) >=

# 需要判断bool值的场合会将对象转换为bool类型，返回True or False 由bool特殊函数决定
# object.__bool__(self)

# 算术运算特殊方法
# object.__add__(self, other)
# object.__sub__(self, other)
# object.__mul__(self, other)
# object.__matmul__(self, other)
# object.__truediv__(self, other)
# object.__floordiv__(self, other)
# object.__mod__(self, other)
# object.__divmod__(self, other)
# object.__pow__(self, other[, modulo])
# object.__lshift__(self, other)
# object.__rshift__(self, other)
# object.__and__(self, other)
# object.__xor__(self, other)
# object.__or__(self, other)
# 详细可以看文档